﻿using System;
using System.Collections.Generic;
using System.Text;

namespace IllustratedCsharp7_ch14_Scope
{
    delegate void MyDel(int x);
    class Chapt14_13_3ScopeOfVariablesAndParameters
    {
        static void _Main()
        {
            MyDel myDel = delegate (int y)
            {
                int z = 10;
                Console.WriteLine("{0},{1}", y, z);
            };
            myDel(2);
            //Console.WriteLine("{0},{1}", y, z); //编译错误，离开作用域

            //1，外部变量，与委托的具名方法不同，匿名方法可以访问它们外围作用域的局部变量环境
            int x = 5;  //变量x定义在匿名方法作用域的前面
            myDel = delegate
            {
                Console.WriteLine("{0}", x); //变量x可以在匿名方法作用域之内使用
            };
            myDel(2);


            //只要捕获方法是委托的一部分，即使变量已经离开了作用域，捕获的外部变量也会一直有效。
            MyDel mDel1;
            {
                int x1 = 1000;
                mDel1 = delegate
                {
                    Console.WriteLine("{0}", x1); //变量x可以在匿名方法作用域之内使用
                };
            }
            //Console.WriteLine("Value of x1{0}", x1); //变量x1离开了作用域并且会导致编译错误

            if (null != mDel1)
                mDel1(2); //而这里使用了x，在匿名方法内部

        }
    }
}
